home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HPAVC
/
HPAVC CD-ROM.iso
/
TUT04NEW.ZIP
/
TUT4.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1994-12-23
|
12KB
|
301 lines
/////////////////////////////////////////////////////////////////////////////
// //
// TUTPROG4.CPP - VGA Trainer Program 4 (in Turbo C++ 3.0) //
// //
// "The VGA Trainer Program" is written by Denthor of Asphyxia. However it //
// was limited to Pascal only in its first run. All I have done is taken //
// his original release, translated it to C++ and touched up a few things. //
// I take absolutely no credit for the concepts presented in this code and //
// am NOT the person to ask for help if you are having trouble. //
// //
// Program Notes : This program implements virtual screens, a great way //
// to update your screen. //
// //
// For this particular program, I have found the compiler //
// option -mc (Compact memory model) to work better than //
// -ml (Large memory model). However, you must use -mc or //
// greater. //
// Also, you might want to go under "Options...Debugger" //
// and increase your programs Heap size to >64k. I don't //
// know if <64k will lock your system, but I had problems. //
// //
// Author : Grant Smith (Denthor) - denthor@beastie.cs.und.ac.za //
// Translator : Christopher G. Mann - r3cgm@dax.cc.uakron.edu //
// //
// Last Modified : December 23, 1994 //
// //
/////////////////////////////////////////////////////////////////////////////
// //
// INCLUDE FILES //
// //
#include <conio.h>
// clrscr(), getch(), kbhit()
#include <dos.h>
// MK_FP, geninterrupt()
#include <iostream.h>
// _fmemset(), cout, memset(), _fmemcpy()
#include <stdlib.h>
// calloc(), exit(), free()
// //
// FUNCTION PROTOTYPES //
// //
// MODE SETTING FUNCTIONS
void SetMCGA();
void SetText();
// VIRTUAL SCREEN FUNCTIONS
void SetUpVirtual();
void ShutDown();
void Flip();
// UTILITY FUNCTIONS
void Cls(unsigned char Col, unsigned char *Where);
void Putpixel (int x, int y, unsigned char Col, unsigned int Where);
void WaitRetrace();
// MID-LEVEL FUNCTIONS
void BlockMove();
void PatternDraw();
// //
// GLOBAL VARIABLE DECLARATIONS //
// //
// declare a pointer to the offset of the Virtual Screen
unsigned char *vaddr = NULL;
// declare a pointer to the offset of the VGA memory
unsigned char *vga = (unsigned char *) MK_FP(0xA000, 0);
///////////////////////////////////////////////////////////////////////////////
// //
// MAIN FUNCTION //
// //
///////////////////////////////////////////////////////////////////////////////
void main() {
clrscr();
cout
<< "This program will demonstrate the power of virtual screens.\n"
<< "A block will firstly move across the screen, being drawn and\n"
<< "erased totally on the VGA. Then the same block will move\n"
<< "across, but will be drawn on the virtual screen and flipped\n"
<< "to the VGA screen without a retrace (see part 2). The the\n"
<< "block will go again, with flipping and a retrace.\n\n"
<< "I will then draw a pattern, flip it to VGA, draw another\n"
<< "pattern, flip it to VGA, and repeat that until a key is pressed.\n"
<< "This will demonstrate that even when I put down 10000 pixels,\n"
<< "then flip them to the VGA, it is still relatively fast.\n\n";
cout << "Hit any key to continue ...";
getch();
SetMCGA();
SetUpVirtual();
Cls(0,vaddr); // After you have got the memory for the virtual screen,
// it is usually filled with random garbage. It is always
// wise to clear the virtual screen directly afterwards
BlockMove();
do PatternDraw();
while (!kbhit());
getch(); // getch() = clear keyboard buffer from kbhit()
SetText();
ShutDown();
cout
<< "All done. This concludes the fourth sample program in the ASPHYXIA\n"
<< "Training series. You may reach DENTHOR under the name of GRANT\n"
<< "SMITH on the MailBox BBS, or leave a message to ASPHYXIA on the\n"
<< "ASPHYXIA BBS. Get the numbers from Roblist, or write to :\n"
<< " Grant Smith\n"
<< " P.O. Box 270\n"
<< " Kloof\n"
<< " 3640\n"
<< "I hope to hear from you soon!\n\n";
cout << "Hit any key to exit ...";
getch();
}
/////////////////////////////////////////////////////////////////////////////
// //
// SetMCGA() - This function gets you into 320x200x256 mode. //
// //
/////////////////////////////////////////////////////////////////////////////
void SetMCGA() {
_AX = 0x0013;
geninterrupt (0x10);
}
/////////////////////////////////////////////////////////////////////////////
// //
// SetText() - This function gets you into text mode. //
// //
/////////////////////////////////////////////////////////////////////////////
void SetText() {
_AX = 0x0003;
geninterrupt (0x10);
}
/////////////////////////////////////////////////////////////////////////////
// //
// Cls() - This clears the screen to the specified color, on the VGA or on //
// the Virtual screen. //
// //
/////////////////////////////////////////////////////////////////////////////
void Cls(unsigned char Col, unsigned char *Where) {
_fmemset(Where, Col, 64000);
}
/////////////////////////////////////////////////////////////////////////////
// //
// WaitRetrace() - This waits until you are in a Verticle Retrace. //
// //
/////////////////////////////////////////////////////////////////////////////
void WaitRetrace() {
_DX = 0x03DA;
l1: asm {
in al,dx;
and al,0x08;
jnz l1;
}
l2: asm {
in al,dx;
and al,0x08;
jz l2;
}
}
/////////////////////////////////////////////////////////////////////////////
// //
// SetUpVirtual() - This sets up the memory needed for the virtual screen. //
// //
/////////////////////////////////////////////////////////////////////////////
void SetUpVirtual() {
vaddr = (unsigned char *) calloc(64000,1);
if (vaddr == NULL) {
SetText();
cout << "Not enough memory available, exiting program...";
exit(1);
}
}
/////////////////////////////////////////////////////////////////////////////
// //
// ShutDown() - This frees the memory used by the virtual screen. //
// //
/////////////////////////////////////////////////////////////////////////////
void ShutDown() {
free(vaddr);
}
/////////////////////////////////////////////////////////////////////////////
// //
// Putpixel() - This puts a pixel at X,Y using color Col, on VGA or the //
// Virtual Screen; //
// //
/////////////////////////////////////////////////////////////////////////////
void Putpixel (int x, int y, unsigned char Col, unsigned char *Where) {
memset(Where+(x+(y*320)),Col,1);
}
/////////////////////////////////////////////////////////////////////////////
// //
// Flip() - This flips the virtual screen to the VGA screen. //
// //
/////////////////////////////////////////////////////////////////////////////
void Flip() {
_fmemcpy(vga,vaddr,64000);
}
/////////////////////////////////////////////////////////////////////////////
// //
// BlockMove() - This tests various ways of moving a block around the //
// screen. //
// //
/////////////////////////////////////////////////////////////////////////////
void BlockMove() {
int loop1, loop2, loop3;
// This draws a block directly to the VGA with no flipping
for (loop1=1; loop1<51; loop1++) {
for (loop2=1; loop2<51; loop2++)
for (loop3=1; loop3<51; loop3++)
Putpixel (loop1+loop2,loop3,32, vga);
Cls(0,vga);
}
// This draws a block to the virtual screen, then flips it to the VGA
for (loop1=1; loop1<51; loop1++) {
for (loop2=1; loop2<51; loop2++)
for (loop3=1; loop3<51; loop3++)
Putpixel (loop1+loop2,loop3,32, vaddr);
Flip();
Cls(0,vaddr);
}
// This draws to the virtual screen, waits for retrace, then flips to VGA
for (loop1=1; loop1<51; loop1++) {
for (loop2=1; loop2<51; loop2++)
for (loop3=1; loop3<51; loop3++)
Putpixel (loop1+loop2,loop3,32, vaddr);
WaitRetrace();
Flip();
Cls(0,vaddr);
}
}
/////////////////////////////////////////////////////////////////////////////
// //
// PatternDraw() - This tests the speed of flipping by drawing two //
// patterns and flipping them. //
// //
/////////////////////////////////////////////////////////////////////////////
void PatternDraw() {
int loop1, loop2;
// This draws pattern #1 to the virtual screen, then flips it to VGA
for(loop1=1; loop1<101; loop1++)
for(loop2=1; loop2<101; loop2++)
Putpixel (loop1,loop2,loop1,vaddr);
Flip();
// This draws pattern #2 to the virtual screen, then flips it to VGA
for(loop1=1; loop1<101; loop1++)
for(loop2=1; loop2<101; loop2++)
Putpixel (loop1,loop2,loop2,vaddr);
Flip();
}